import Vue from 'vue'
import { MESSAGE_TYPE } from '../../../helpers/constants'
import { findUndeliveredMessage } from './helpers'

export const mutations = {
  clearConversations ($state) {
    Vue.set($state, 'conversations', {})
  },
  pushMessageToConversation ($state, message) {
    const { id, status, messageType: type } = message

    const messagesInbox = $state.conversations
    const isMessageIncoming = type === MESSAGE_TYPE.INCOMING
    const isTemporaryMessage = status === 'in_progress'

    if (!isMessageIncoming || isTemporaryMessage) {
      Vue.set(messagesInbox, id, message)
      return
    }

    const [messageInConversation] = findUndeliveredMessage(
      messagesInbox,
      message
    )
    if (!messageInConversation) {
      Vue.set(messagesInbox, id, message)
    } else {
      Vue.delete(messagesInbox, messageInConversation.id)
      Vue.set(messagesInbox, id, message)
    }
  },

  updateAttachmentMessageStatus ($state, { message, tempId }) {
    const { id } = message
    const messagesInbox = $state.conversations

    const messageInConversation = messagesInbox[tempId]

    if (messageInConversation) {
      Vue.delete(messagesInbox, tempId)
      Vue.set(messagesInbox, id, { ...message })
    }
  },

  setConversationUIFlag ($state, uiFlags) {
    $state.uiFlags = {
      ...$state.uiFlags,
      ...uiFlags
    }
  },

  setConversationListLoading ($state, status) {
    $state.uiFlags.isFetchingList = status
  },

  setMessagesInConversation ($state, payload) {
    if (!payload.length) {
      $state.uiFlags.allMessagesLoaded = true
      return
    }

    payload.map(message => Vue.set($state.conversations, message.id, message))
  },

  updateMessage ($state, { id, contentAttributes }) {
    $state.conversations[id] = {
      ...$state.conversations[id],
      contentAttributes: {
        ...($state.conversations[id].contentAttributes || {}),
        ...contentAttributes
      }
    }
  },

  updateMessageMeta ($state, { id, meta }) {
    const message = $state.conversations[id]
    if (!message) return

    const newMeta = message.meta ? { ...message.meta, ...meta } : { ...meta }
    Vue.set(message, 'meta', {
      ...newMeta
    })
  },

  deleteMessage ($state, id) {
    const messagesInbox = $state.conversations
    Vue.delete(messagesInbox, id)
  },

  toggleAgentTypingStatus ($state, { status }) {
    const isTyping = status === 'on'
    $state.uiFlags.isAgentTyping = isTyping
  },

  setMetaUserLastSeenAt ($state, lastSeen) {
    $state.meta.userLastSeenAt = lastSeen
  }
}
